//
//  SPHandEvaluator.h
//  ShandongPoker
//
//  Created by Developer on 2025-01-08.
//  Copyright © 2025 ShandongPoker. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "SPCard.h"

NS_ASSUME_NONNULL_BEGIN

/**
 * 牌型评估结果
 */
@interface SPHandResult : NSObject

/// 牌型
@property (nonatomic, assign) SPHandRank handRank;

/// 牌型名称
@property (nonatomic, strong, readonly) NSString *handName;

/// 组成牌型的牌
@property (nonatomic, strong) NSArray<SPCard *> *bestCards;

/// 踢脚牌（用于比较相同牌型）
@property (nonatomic, strong) NSArray<SPCard *> *kickerCards;

/// 牌型分数（用于排序）
@property (nonatomic, assign, readonly) NSInteger score;

/**
 * 初始化牌型结果
 * @param handRank 牌型
 * @param bestCards 最佳牌组合
 * @param kickerCards 踢脚牌
 * @return 牌型结果实例
 */
- (instancetype)initWithHandRank:(SPHandRank)handRank 
                       bestCards:(NSArray<SPCard *> *)bestCards 
                     kickerCards:(NSArray<SPCard *> *)kickerCards;

@end

/**
 * 牌型判断算法
 * 用于判断德州扑克的牌型大小
 */
@interface SPHandEvaluator : NSObject

/**
 * 评估手牌
 * @param holeCards 手牌（2张）
 * @param communityCards 公共牌（最多5张）
 * @return 最佳牌型结果
 */
+ (SPHandResult *)evaluateHandWithHoleCards:(NSArray<SPCard *> *)holeCards 
                             communityCards:(NSArray<SPCard *> *)communityCards;

/**
 * 比较两个牌型结果
 * @param result1 第一个牌型结果
 * @param result2 第二个牌型结果
 * @return 比较结果
 */
+ (NSComparisonResult)compareHandResult:(SPHandResult *)result1 
                            withResult:(SPHandResult *)result2;

/**
 * 判断是否为同花
 * @param cards 要检查的牌
 * @return 是否为同花
 */
+ (BOOL)isFlush:(NSArray<SPCard *> *)cards;

/**
 * 判断是否为顺子
 * @param cards 要检查的牌
 * @return 是否为顺子
 */
+ (BOOL)isStraight:(NSArray<SPCard *> *)cards;

/**
 * 判断是否为同花顺
 * @param cards 要检查的牌
 * @return 是否为同花顺
 */
+ (BOOL)isStraightFlush:(NSArray<SPCard *> *)cards;

/**
 * 判断是否为皇家同花顺
 * @param cards 要检查的牌
 * @return 是否为皇家同花顺
 */
+ (BOOL)isRoyalFlush:(NSArray<SPCard *> *)cards;

/**
 * 获取牌的点数频率
 * @param cards 要分析的牌
 * @return 点数频率字典，key为点数，value为出现次数
 */
+ (NSDictionary<NSNumber *, NSNumber *> *)rankFrequency:(NSArray<SPCard *> *)cards;

/**
 * 获取牌的花色频率
 * @param cards 要分析的牌
 * @return 花色频率字典，key为花色，value为出现次数
 */
+ (NSDictionary<NSNumber *, NSNumber *> *)suitFrequency:(NSArray<SPCard *> *)cards;

/**
 * 获取所有可能的5张牌组合
 * @param cards 所有可用的牌
 * @return 所有可能的5张牌组合
 */
+ (NSArray<NSArray<SPCard *> *> *)allPossibleFiveCardCombinations:(NSArray<SPCard *> *)cards;

/**
 * 评估5张牌的牌型
 * @param cards 5张牌
 * @return 牌型结果
 */
+ (SPHandResult *)evaluateFiveCardHand:(NSArray<SPCard *> *)cards;

@end

NS_ASSUME_NONNULL_END 